package com.yuandian.middle.platform.utils;

import com.jcraft.jsch.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.List;
import java.util.Properties;


@Component
public class SFTPUtils {

    private Logger logger = LoggerFactory.getLogger(SFTPUtils.class);

    public Session session = null;
    public Channel channel = null;


    /**
	 * FTP 数据发送
	 * @param fileInfoList	待发送文件信息
	 * @param host	IP地址
	 * @param port	端口信息
	 * @param username	用户名
	 * @param password  密码
	 * @param remotePosition	地址
	 */
    public void uploadFileUsingSshj(List<String> fileInfoList,
									String host,
									String port,
									String username,
									String password,
									String remotePosition) {
        try {
            ChannelSftp channelSftp = getChannel(host, port, username, password);
            logger.info("建立SFTP链接成功,开始传输文件!");
            logger.info("---------------文件上传开始--------------");
            for (String fileInfo : fileInfoList) {
				File tempFile = new File(fileInfo);

                String dstFilePath = remotePosition + tempFile.getName();

                logger.info("文件名处理结束,文件路径:{}", dstFilePath);
                channelSftp.put(fileInfo, dstFilePath);
                logger.info("文件上传成功:{}", dstFilePath);

                logger.info("开始删除原始文件");
                tempFile.delete();
                logger.info("删除原始文件结束");
            }
            logger.info("---------------文件上传结束--------------");
            channelSftp.quit();
        } catch (Exception e) {
            logger.error("文件上传出错:" + e.getMessage());
            e.printStackTrace();
        } finally {
            if (channel != null) {
                channel.disconnect();
				logger.info("关闭通道!");
            }
            if (session != null) {
                session.disconnect();
				logger.info("关闭session!");
            }
        }
    }

    private ChannelSftp getChannel(String ftpHost, String port, String ftpUserName, String ftpPassword) throws JSchException {

        int ftpPort = 22;
        if (port != null && !port.equals("")) {
            ftpPort = Integer.parseInt(port);
        }
        if (session == null || !session.isConnected()) {
            logger.info("开始创建链接");
            JSch jsch = new JSch(); // 创建JSch对象
            session = jsch.getSession(ftpUserName, ftpHost, ftpPort); // 根据用户名，主机ip，端口获取一个Session对象
            if (ftpPassword != null) {
                session.setPassword(ftpPassword); // 设置密码
            }
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config); // 为Session对象设置properties
            session.setTimeout(5000); // 设置timeout时间
            session.connect(); // 通过Session建立链接
            logger.info("创建链接,获取会话成功!");
        }
        logger.info("建立SFTP通道开始");
        channel = session.openChannel("sftp"); // 打开SFTP通道
        channel.connect(); // 建立SFTP通道的连接
        logger.info("建立SFTP通道结束!");
        return (ChannelSftp) channel;
    }



    /**
     * 删除文件
     * @param path 文件地址
     */
    public static void delFile(String path) {
        File file = new File(path);
        String[] fileName = file.list();
        File temp = null;
		for (String s : fileName) {
			if (path.endsWith(File.separator)) {
				temp = new File(path + s);
			} else {
				temp = new File(path + File.separator + s);
			}
			if (temp.isFile()) {
				temp.delete();
			}
		}
    }


    public void closeChannel() throws Exception {
        if (channel != null) {
            channel.disconnect();
        }
        if (session != null) {
            session.disconnect();
        }
    }


}
